package br.com.toscano.gobra.view;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.inject.Inject;

import br.com.toscano.gobra.business.AditivoBC;
import br.com.toscano.gobra.business.AgrupamentoItemBC;
import br.com.toscano.gobra.business.LicitacaoBC;
import br.com.toscano.gobra.business.LocalItemBC;
import br.com.toscano.gobra.business.ObraBC;
import br.com.toscano.gobra.business.TabelaPrecoBC;
import br.com.toscano.gobra.business.TipoARTBC;
import br.com.toscano.gobra.business.UnidadeOrcamentariaBC;
import br.com.toscano.gobra.domain.Aditivo;
import br.com.toscano.gobra.domain.AgrupamentoItem;
import br.com.toscano.gobra.domain.ItemTabelaPreco;
import br.com.toscano.gobra.domain.LocalItem;
import br.com.toscano.gobra.domain.Obra;
import br.com.toscano.gobra.domain.TabelaPreco;
import br.com.toscano.gobra.domain.TipoART;
import br.com.toscano.gobra.domain.UnidadeOrcamentaria;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractEditPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;

@ViewController
@PreviousView("./aditivo_list.jsf")
public class AditivoEditMB extends AbstractEditPageBean<Aditivo, Long> {

	private static final long serialVersionUID = 1L;

	private String posicaoItem;
	
	public String getPosicaoItem() {
		if (posicaoItem == null) posicaoItem = "A"; 
		return posicaoItem;
	}

	public void setPosicaoItem(String posicaoItem) {
		this.posicaoItem = posicaoItem;
	}


	@Inject
	private TabelaPrecoBC tabelaPrecoBC;
	private List<SelectItem> tabelaPrecos;
	private Long tabelaPreco;
	

	public List<SelectItem> getTabelaPrecos() {
		tabelaPrecos = new ArrayList<SelectItem>();
		List<TabelaPreco> lista = tabelaPrecoBC.findAll();
		for (TabelaPreco obj: lista) {
			tabelaPrecos.add(new SelectItem(obj.getId(), obj.getDescricao()));
		}
		return tabelaPrecos;
	}

	public void setTabelaPrecos(List<SelectItem> tabelaPrecos) {
		this.tabelaPrecos = tabelaPrecos;
	}

	public Long getTabelaPreco() {
		return tabelaPreco;
	}

	public void setTabelaPreco(Long tabelaPreco) {
		this.tabelaPreco = tabelaPreco;
	}


	private String codigoItem;
	
	public String getCodigoItem() {
		return codigoItem;
	}

	public void setCodigoItem(String codigoItem) {
		this.codigoItem = codigoItem;
	}

	private List<SelectItem> itemTabelaPrecos;
	private Long itemTabelaPreco;
	
	public List<SelectItem> getItemTabelaPrecos() {
		itemTabelaPrecos = new ArrayList<SelectItem>();
		if (this.getTabelaPreco() != null) {
			List<ItemTabelaPreco> lista = tabelaPrecoBC.load(this.getTabelaPreco()).getListaItemTabelaPrecos();
			for (ItemTabelaPreco obj: lista) {
				itemTabelaPrecos.add(new SelectItem(obj.getId(), obj.getDescricao() +  " - " + obj.getDescricao()));
			}
		}

		return itemTabelaPrecos;
	}

	public void setItemTabelaPrecos(List<SelectItem> itemTabelaPrecos) {
		this.itemTabelaPrecos = itemTabelaPrecos;
	}

	public Long getItemTabelaPreco() {
		return itemTabelaPreco;
	}

	public void setItemTabelaPreco(Long itemTabelaPreco) {
		this.itemTabelaPreco = itemTabelaPreco;
	}
	
	private BigDecimal quantidade;
	
	public BigDecimal getQuantidade() {
		if (quantidade ==null) quantidade = BigDecimal.ZERO;
				
		return quantidade;
	}

	public void setQuantidade(BigDecimal quantidade) {
		this.quantidade = quantidade;
	}


	private Integer periodoInicialItem;
	private Integer periodoFinalItem;
	private List<SelectItem> periodos;

	public Integer getPeriodoInicialItem() {
		return periodoInicialItem;
	}

	public void setPeridoInicialItem(Integer periodoInicialItem) {
		this.periodoInicialItem = periodoInicialItem;
	}

	public Integer getPeriodoFinalItem() {
		return periodoFinalItem;
	}

	public void setPeridoFinalItem(Integer periodoFinalItem) {
		this.periodoFinalItem = periodoFinalItem;
	}

	public List<SelectItem> getPeriodos() {
		periodos = new ArrayList<SelectItem>();
		if (this.getBean() != null && this.getBean().getQuantidadeDias() != null) {
			for (int i = 0; i < this.getBean().getQuantidadeDias(); i++) {
				periodos.add(new SelectItem(i + "", i + ""));
			}
		}
		return periodos;
	}

	public void setPeriodos(List<SelectItem> periodos) {
		this.periodos = periodos;
	}


	private BigDecimal bdiCadastro;
	private BigDecimal bdi;
	private List<SelectItem> bdis;
	

	public BigDecimal getBdiCadastro() {
		return bdiCadastro;
	}

	public void setBdiCadastro(BigDecimal bdiCadastro) {
		this.bdiCadastro = bdiCadastro;
	}

	public BigDecimal getBdi() {
		return bdi;
	}

	public void setBdi(BigDecimal bdi) {
		this.bdi = bdi;
	}

	public List<SelectItem> getBdis() {
		return bdis;
	}

	public void setBdis(List<SelectItem> bdis) {
		this.bdis = bdis;
	}

	@Inject
	private LocalItemBC localItemBC;
	private List<SelectItem> localItems;
	private Long localItem;

	public List<SelectItem> getLocalItems() {
		localItems = new ArrayList<SelectItem>();
		List<LocalItem> lista = localItemBC.findAll();
		for (LocalItem obj: lista) {
			localItems.add(new SelectItem(obj.getId(), obj.getDescricao()));
		}
		return localItems;
	}

	public void setLocalItems(List<SelectItem> localItems) {
		this.localItems = localItems;
	}

	public Long getLocalItem() {
		return localItem;
	}

	public void setLocalItem(Long localItem) {
		this.localItem = localItem;
	}
	
	@Inject
	private AgrupamentoItemBC agrupamentoItemBC;
	private List<SelectItem> agrupamentoItems;
	private Long agrupamentoItem;

	public List<SelectItem> getAgrupamentoItems() {
		agrupamentoItems = new ArrayList<SelectItem>();
		List<AgrupamentoItem> lista = agrupamentoItemBC.findAll();
		for (AgrupamentoItem obj: lista) {
			agrupamentoItems.add(new SelectItem(obj.getId(), obj.getDescricao()));
		}
		return agrupamentoItems;
	}
	
	public void setAgrupamentoItems(List<SelectItem> agrupamentoItems) {
		this.agrupamentoItems = agrupamentoItems;
	}

	public Long getAgrupamentoItem() {
		return agrupamentoItem;
	}

	public void setAgrupamentoItem(Long agrupamentoItem) {
		this.agrupamentoItem = agrupamentoItem;
	}

	@Inject
	private UnidadeOrcamentariaBC unidadeOrcamentariaBC;
	private List<SelectItem> unidadeOrcamentarias;
	private Long unidadeOrcamentaria;

	public List<SelectItem> getUnidadeOrcamentarias() {
		unidadeOrcamentarias = new ArrayList<SelectItem>();
		List<UnidadeOrcamentaria> lista = unidadeOrcamentariaBC.findAll();
		for (UnidadeOrcamentaria obj: lista) {
			unidadeOrcamentarias.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}
		return unidadeOrcamentarias;
	}

	public void setUnidadeOrcamentarias(List<SelectItem> unidadeOrcamentarias) {
		this.unidadeOrcamentarias = unidadeOrcamentarias;
	}

	public Long getUnidadeOrcamentaria() {
		if(this.obra == null && this.getBean().getLicitacao() != null &&this.getBean().getLicitacao().getObra() != null ) {
			unidadeOrcamentaria = this.getBean().getLicitacao().getObra().getUnidadeOrcamentaria().getId();
		}
		return unidadeOrcamentaria;
	}

	public void setUnidadeOrcamentaria(Long unidadeOrcamentaria) {
		this.unidadeOrcamentaria = unidadeOrcamentaria;
	}
	
	@Inject
	private TipoARTBC tipoARTBC;
	private List<SelectItem> tipoARTs;
	private Long tipoART;


	public List<SelectItem> getTipoARTs() {
		tipoARTs = new ArrayList<SelectItem>();
		List<TipoART> lista = tipoARTBC.findAll();
		for (TipoART obj: lista) {
			tipoARTs.add(new SelectItem(obj.getId(), obj.getDescricao()));
		}
		return tipoARTs;
	}

	public void setTipoARTs(List<SelectItem> tipoARTs) {
		this.tipoARTs = tipoARTs;
	}

	public Long getTipoART() {
		if(this.tipoART == null && this.getBean().getTipoArt() != null) {
			tipoART = this.getBean().getTipoArt().getId();
		}
		return tipoART;
	}

	public void setTipoART(Long tipoART) {
		this.tipoART = tipoART;
	}

	@Inject
	private LicitacaoBC licitacaoBC;

	@Inject
	private ObraBC obraBC;
	private List<SelectItem> obras;
	private Long obra;

	public List<SelectItem> getObras() {
		obras = new ArrayList<SelectItem>();
		List<Obra> lista = obraBC.findAll();
		for (Obra obj: lista) {
			obras.add(new SelectItem(obj.getId() , obj.getTitulo()));
		}
		return obras;
	}

	public void setObras(List<SelectItem> obras) {
		this.obras = obras;
	}

	public Long getObra() {
		if(this.obra == null && this.getBean().getLicitacao() != null &&this.getBean().getLicitacao().getObra() != null ) {
			obra = this.getBean().getLicitacao().getObra().getId();
			unidadeOrcamentaria = this.getBean().getLicitacao().getObra().getUnidadeOrcamentaria().getId();
					}

		return obra;
	}

	public void setObra(Long obra) {
		this.obra = obra;
	}
	
	@Inject
	private AditivoBC aditivoBC;
	
	@Override
	@Transactional
	public String delete() {
		this.aditivoBC.delete(getId());
		return getPreviousView();
	}
	
	public void montarObjeto(){
		if(this.obra != null) {
			this.getBean().setLicitacao(this.licitacaoBC.consultarLicitacao(this.obra));
		}
		if(this.tipoART != null) {
			this.getBean().setTipoArt(this.tipoARTBC.load(this.tipoART));
		}
	}
	
	@Override
	@Transactional
	public String insert() {
		montarObjeto();
		this.aditivoBC.insert(getBean());
		return getPreviousView();
	}
	
	@Override
	@Transactional
	public String update() {
		montarObjeto();
		this.aditivoBC.update(getBean());
		return getPreviousView();
	}
	
	@Override
	protected Aditivo handleLoad(Long id) {
		setBean(this.aditivoBC.load(getId()));
		return this.getBean();
	}
	
	public void adicionarBDI(){
		
	}
	
	public void adicionarItens(){
		
	}
	
	public void removerItens(){
		
	}
	
	public void exportarCronograma(){
		
	}

}